# RUN: llc -o - -run-pass=x86-pseudo -verify-machineinstrs %s | FileCheck %s

--- |
  target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
  target triple = "x86_64-apple-macosx11.0.0"

  declare i8* @objc_retainAutoreleasedReturnValue(i8*)
  declare i8* @objc_unsafeClaimAutoreleasedReturnValue(i8*)
  declare i8* @fn()

  define void @test_objc_retainAutoreleaseReturnedValue() {
    ret void
  }

  define void @test_objc_unsafeClaimAutoreleasedReturnValue() {
    ret void
  }

  define void @test_objc_unsafeClaimAutoreleasedReturnValue_2_args() {
    ret void
  }

  define void @test_ret_void() {
    ret void
  }

...
---
# CHECK-LABEL: name: test_objc_retainAutoreleaseReturnedValue
# CHECK:      bb.0
# CHECK-NEXT:   frame-setup PUSH64r undef $rax, implicit-def $rsp, implicit $rsp
# CHECK-NEXT:   CFI_INSTRUCTION def_cfa_offset 16
# CHECK-NEXT:   CALL64pcrel32 @fn, csr_64, implicit $rsp, implicit $ssp, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
# CHECK-NEXT:   $rdi = MOV64rr $rax
# CHECK-NEXT:   CALL64pcrel32 @objc_retainAutoreleasedReturnValue, csr_64, implicit $rsp, implicit $ssp, implicit-def $rax
# CHECK-NEXT:   $rcx = frame-destroy POP64r implicit-def $rsp, implicit $rsp
# CHECK-NEXT:   RETQ
#

name:            test_objc_retainAutoreleaseReturnedValue
alignment:       16
tracksRegLiveness: true
frameInfo:
  stackSize:       8
  offsetAdjustment: -8
  maxAlignment:    1
  adjustsStack:    true
  hasCalls:        true
  maxCallFrameSize: 0
machineFunctionInfo: {}
body:             |
  bb.0 (%ir-block.0):
    frame-setup PUSH64r undef $rax, implicit-def $rsp, implicit $rsp
    CFI_INSTRUCTION def_cfa_offset 16
    CALL64pcrel32_RVMARKER 0, @fn, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
    $rcx = frame-destroy POP64r implicit-def $rsp, implicit $rsp
    RET 0, $rax

...
---
# CHECK-LABEL: name: test_objc_unsafeClaimAutoreleasedReturnValue
# CHECK:      bb.0
# CHECK-NEXT:   frame-setup PUSH64r undef $rax, implicit-def $rsp, implicit $rsp
# CHECK-NEXT:   CFI_INSTRUCTION def_cfa_offset 16
# CHECK-NEXT:   CALL64pcrel32 @fn, csr_64, implicit $rsp, implicit $ssp, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
# CHECK-NEXT:   $rdi = MOV64rr $rax
# CHECK-NEXT:   CALL64pcrel32 @objc_unsafeClaimAutoreleasedReturnValue, csr_64, implicit $rsp, implicit $ssp, implicit-def $rax
# CHECK-NEXT:   $rcx = frame-destroy POP64r implicit-def $rsp, implicit $rsp
# CHECK-NEXT:   RETQ
#
name:            test_objc_unsafeClaimAutoreleasedReturnValue
alignment:       16
tracksRegLiveness: true
frameInfo:
  stackSize:       8
  offsetAdjustment: -8
  maxAlignment:    1
  adjustsStack:    true
  hasCalls:        true
  maxCallFrameSize: 0
machineFunctionInfo: {}
body:             |
  bb.0 (%ir-block.0):
    frame-setup PUSH64r undef $rax, implicit-def $rsp, implicit $rsp
    CFI_INSTRUCTION def_cfa_offset 16
    CALL64pcrel32_RVMARKER 1, @fn, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
    $rcx = frame-destroy POP64r implicit-def $rsp, implicit $rsp
    RET 0, $rax

...
---
# CHECK-LABEL: name: test_objc_unsafeClaimAutoreleasedReturnValue_2_args
# CHECK:      bb.0
# CHECK:        frame-setup PUSH64r undef $rax, implicit-def $rsp, implicit $rsp
# CHECK-NEXT:   $rax = MOV64rr $rdi
# CHECK-NEXT:   $rdi = MOV64rr killed $rdx
# CHECK-NEXT:   $rdx = MOV64rr killed $rax
# CHECK-NEXT:   CALL64pcrel32 @fn, csr_64, implicit $rsp, implicit $ssp, implicit $rsp, implicit $ssp, implicit $rdi, implicit $rsi, implicit $rdx, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
# CHECK-NEXT:   $rdi = MOV64rr $rax
# CHECK-NEXT:   CALL64pcrel32 @objc_retainAutoreleasedReturnValue, csr_64, implicit $rsp, implicit $ssp, implicit-def dead $rax
# CHECK-NEXT:   $rax = frame-destroy POP64r implicit-def $rsp, implicit $rsp
# CHECK-NEXT:   RETQ
#
name:            test_objc_unsafeClaimAutoreleasedReturnValue_2_args
alignment:       16
tracksRegLiveness: true
frameInfo:
  stackSize:       8
  offsetAdjustment: -8
  maxAlignment:    1
  adjustsStack:    true
  hasCalls:        true
  maxCallFrameSize: 0
machineFunctionInfo: {}
body:             |
  bb.0 (%ir-block.0):
    liveins: $rdi, $rdx, $rsi

    frame-setup PUSH64r undef $rax, implicit-def $rsp, implicit $rsp
    $rax = MOV64rr $rdi
    $rdi = MOV64rr killed $rdx
    $rdx = MOV64rr killed $rax
    CALL64pcrel32_RVMARKER 0, @fn, csr_64, implicit $rsp, implicit $ssp, implicit $rdi, implicit $rsi, implicit $rdx, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax
    $rax = frame-destroy POP64r implicit-def $rsp, implicit $rsp
    RET 0, $rax

...
# CHECK-LABEL: name: test_ret_void
# CHECK:      bb.0
# CHECK-NEXT:   frame-setup PUSH64r undef $rax, implicit-def $rsp, implicit $rsp
# CHECK-NEXT:   CFI_INSTRUCTION def_cfa_offset 16
# CHECK-NEXT:   CALL64pcrel32 @fn, csr_64, implicit $rsp, implicit $ssp, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
# CHECK-NEXT:   $rdi = MOV64rr $rax
# CHECK-NEXT:   CALL64pcrel32 @objc_retainAutoreleasedReturnValue, csr_64, implicit $rsp, implicit $ssp, implicit-def dead $rax
# CHECK-NEXT:   $rax = frame-destroy POP64r implicit-def $rsp, implicit $rsp
# CHECK-NEXT:   RETQ
#
name:            test_ret_void
alignment:       16
tracksRegLiveness: true
frameInfo:
  stackSize:       8
  offsetAdjustment: -8
  maxAlignment:    1
  adjustsStack:    true
  hasCalls:        true
  maxCallFrameSize: 0
machineFunctionInfo: {}
body:             |
  bb.0 (%ir-block.0):
    frame-setup PUSH64r undef $rax, implicit-def $rsp, implicit $rsp
    CFI_INSTRUCTION def_cfa_offset 16
    CALL64pcrel32_RVMARKER 0, @fn, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax
    $rax = frame-destroy POP64r implicit-def $rsp, implicit $rsp
    RET 0
